#define TAMANHO_n 6
#define TAMANHO_N (TAMANHO_n*(TAMANHO_n - 1))/2
#define NUM_SLOTS 31
#define TAMANHO_PALAVRA 40
#define TAMANHO_FRASE 999999
#define TAMANHO_WAVELENGTH 40
#define N_ROTAS_YEN 5 //enquanto ela for um o de baixo vale, nao testei para mais ainda
#define N_ROTAS (N_ROTAS_YEN-1) // para de ir de 0 -> n-1 e nao de 1 -> n.





char texto[TAMANHO_FRASE];	//usado para ler e converter textos
char palavra[TAMANHO_PALAVRA];
int troca[TAMANHO_n][TAMANHO_n][N_ROTAS_YEN];
int dist[TAMANHO_n][TAMANHO_n];

//*******************************INICIO _ variaveis basicas****************************
int E[TAMANHO_n][TAMANHO_n],traf[TAMANHO_n][TAMANHO_n];//E = matriz de adjacencias e traf = matriz de trafego
int n; //numero de nos da rede
//*******************************FIM _ variaveis basicas****************************

//*********************INICIO _ YEN****************************
int M[TAMANHO_n][TAMANHO_n][N_ROTAS_YEN][TAMANHO_n+1]; 

typedef struct{

	int w; //primeiro slot alocado para aquela demanda
	int rota; //indice da rota utilizada na matriz M[i][j][rota][k]
	int demanda; //quantidade de slots ocupados
	
} Rede;

typedef struct{
	int * slots;

} RNET;

struct no{
	int s, d;
	int peso;
	int demanda;
	struct no * prox;
};

typedef struct no No;

typedef struct{
	No * ini;
	No * fim;
	int tam;
	
	
} Lista;


//
void LeMatriz(char *instancia);
//
int convertearquivo();
//
int ArqRotas();
//
int lerEanalisar01();
//
int mostratudo();
//
int contaSaltos(int s,int d,int t);
//	
int descobreNumLinks(void);
//
Rede ** alocaRede(void);
//
void recebeDemanda( Rede ** rede);
//
void imprimeDemanda ( Rede ** rede);
//
RNET ** alocaMatrizRNET(void);
//
void alocaVetorSlots(RNET ** rnet);
//
int contaZeroSequencial( int *v, int traf, int * freq);

int calculaRota(RNET ** rnet, int i, int j, int *freq);
//
void imprimeRNET( RNET ** rnet, int valor);
//
No * inicializa();
//
void erro();
//
int ** alocaMatriz();
//
int ** alocaMatrizZerada();
//
void insereNodo(Lista * l, No * novo);
//
void roleta(int * s, int * d);
//
int calculaPeso(int s, int d, int demanda);
//
int calculaPesoFitness(int s, int d, int demanda,int caminho);
//
Lista * recebeRecurso(Lista * l);
//
void imprimeLista(Lista * l);
//
void zeraMatriz(int ** mat, int l, int c);

int calculaRotaUnica( RNET ** rnet, int i, int j, int *freq, int rota);

int calculaRotaRandom( RNET ** rnet, int ** qtdRotas, int i, int j, int *freq, int * contaRotaZero, int valorListaTaxada);

int comparaRede(Rede ** m1, Rede ** m2, int numNodos);
//
void liberaRnet(RNET ** rnet);
//
void liberaMatriz(int ** mat, int tam);
//
double randomico(double min, double max);
//
int irandomico(int min, int max);
//
void matrizQtdRotas(int ** qtdRotas);



































